home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Games / Arashi 1.1.1 / source code / For your think c folder / VA Kit ƒ / ScreenSelect.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-02-18  |  4.7 KB  |  226 lines  |  [TEXT/KAHL]

  1. /*/
  2.      Project Arashi: ScreenSelect.c
  3.      Major release: Version 1.1d2, 9/5/95
  4.  
  5.      Last modification: Thursday, February 18, 1993, 16:26
  6.      Created: Thursday, February 7, 1991, 7:21
  7.  
  8.      Copyright © 1991-1993, Juri Munkki
  9. /*/
  10.  
  11. #include    "ScreenSelect.h"
  12.  
  13. #define        HILITEMODE    asm {    BCLR    #7,0x938    }
  14.  
  15. extern    EventRecord        Event;
  16.  
  17. ScreenInfo            *Screens;
  18. int                    NumScreens;
  19. PicHandle            YesPict,NoPict;
  20. Rect                MessageFrame;
  21.  
  22. void    CreateScreenWindows()
  23. {
  24.     register    GDHandle    GDev;
  25.                 Rect        DispFrame,WindFrame;
  26.                 int            zero=0;
  27.     
  28.     GDev=GetDeviceList();
  29.  
  30.     do
  31.     {    
  32.         DispFrame=(*GDev)->gdRect;
  33.         
  34.         WindFrame.left=(DispFrame.right+DispFrame.left-MessageFrame.right)/2;
  35.         WindFrame.right=WindFrame.left+MessageFrame.right;
  36.  
  37. #define    no_CLASSIC_SCREEN_TEST
  38. #ifdef    CLASSIC_SCREEN_TEST
  39.         WindFrame.bottom=342;
  40.         WindFrame.top=WindFrame.bottom-MessageFrame.bottom;
  41. #else
  42.         WindFrame.top=DispFrame.bottom-MessageFrame.bottom-4;
  43.         WindFrame.bottom=WindFrame.top+MessageFrame.bottom;
  44. #endif
  45.         Screens[NumScreens].status=(*(*GDev)->gdPMap)->pixelSize == 8;
  46.         Screens[NumScreens].device=GDev;
  47.         Screens[NumScreens].window=NewWindow(0,&WindFrame,&zero,-1,plainDBox,(void *)-1,0,0);
  48.         
  49.         NumScreens++;    
  50.         GDev=GetNextDevice(GDev);
  51.     }    while(GDev && NumScreens<MAXSCREENS);
  52. }
  53. /*
  54. >>    Gets the mouse position while in a tracking loop.
  55. >>    Returns true when the mouse button comes up.
  56. */
  57.  
  58. int GetMouseTrackEvent(pt)
  59. register    Point    *pt;
  60. {
  61.     register    int     r=0;
  62.     
  63.     r=GetNextEvent(mUpMask+mDownMask,&Event);
  64.     *pt=Event.where;
  65.     GlobalToLocal(pt);
  66.     
  67.     if(r)    r=(Event.what==mouseUp);
  68.     return !r;
  69. }
  70.  
  71. ScreenInfo    *Clickety(info)
  72. register    ScreenInfo    *info;
  73. {
  74.     register    int        state;
  75.     register    int        flag;
  76.                 Point    where;
  77.  
  78.     state=0;
  79.     SetPort(info->window);
  80.     
  81.     do
  82.     {    flag=GetMouseTrackEvent(&where);
  83.         if(state != (PtInRect(where,&info->window->portRect)))
  84.         {    state = !state;
  85.             HILITEMODE;
  86.             InvertRect(&info->window->portRect);
  87.         }
  88.     }    while(flag);
  89.     
  90.     if(state)
  91.     {    HILITEMODE;
  92.         InvertRect(&info->window->portRect);
  93.     }
  94.     
  95.     if(state)    return info;
  96.     else        return 0;
  97. }
  98. ScreenInfo    *FindWindowInfo(window)
  99. WindowPtr    window;
  100. {
  101.     register    ScreenInfo    *found;
  102.     register    int            i;
  103.  
  104.     found=0;
  105.     for(i=0;i<NumScreens;i++)
  106.     {    if(Screens[i].window==window)
  107.             found=&Screens[i];
  108.     }
  109.     return    found;
  110. }
  111.  
  112. Handle    ScreenSelect()
  113. {
  114.     register    int            done,i;
  115.     register    ScreenInfo    *found;
  116.     register    GDHandle    TheDisplay;
  117.     register    int            ScreenAvailable=1;
  118.     register    int            OldScreenAvailable=1;
  119.                 WindowPtr    hitwindow;
  120.  
  121.     YesPict=(void *)GetResource('PICT',YESPICTID);
  122.     NoPict=(void *)GetResource('PICT',NOPICTID);
  123.     MessageFrame=(*YesPict)->picFrame;
  124.     OffsetRect(&MessageFrame,-MessageFrame.left,-MessageFrame.top);
  125.     
  126.     Screens=(void *)NewPtr(sizeof(ScreenInfo)*MAXSCREENS);
  127.     NumScreens=0;
  128.  
  129.     CreateScreenWindows();
  130.     CreateOptionsDialog();
  131.  
  132.     done=NotDone;
  133.     
  134.     do
  135.     {
  136.         if(ScreenAvailable != OldScreenAvailable)
  137.         {    OptionsUpdate(ScreenAvailable);
  138.             OldScreenAvailable = ScreenAvailable;
  139.         }
  140.         
  141.         SystemTask();
  142.         if(    GetNextEvent(everyEvent,&Event))
  143.         {    if(IsDialogEvent(&Event) && Event.what != keyDown)
  144.             {    int            ItemHit;
  145.                 DialogPtr    DialogHit;
  146.             
  147.                 if(DialogSelect(&Event,&DialogHit,&ItemHit))
  148.                 {    done=DoStartupDialog(ItemHit);
  149.                 }
  150.             }
  151.             else
  152.             switch(Event.what)
  153.             {    case keyDown:
  154.                 case autoKey:
  155.                     done=DefaultDone;
  156.                     break;
  157.                 case mouseDown:
  158.                     switch(FindWindow(Event.where,&hitwindow))
  159.                     {    case inSysWindow:
  160.                             SystemClick(&Event,hitwindow);
  161.                             break;
  162.                         case inContent:
  163.                         case inGrow:
  164.                         case inDrag:
  165.                         
  166.                             found=FindWindowInfo(hitwindow);
  167.                             if(found && found->status)
  168.                             {    found=Clickety(found);
  169.                                 if(found)
  170.                                 {    done= SelectDone;
  171.                                     TheDisplay=found->device;
  172.                                 }
  173.                             }
  174.                             break;
  175.                     }
  176.                     break;
  177.                 case updateEvt:
  178.                     SetPort((GrafPtr)Event.message);
  179.                     BeginUpdate((GrafPtr)Event.message);
  180.                     found=FindWindowInfo((GrafPtr)Event.message);
  181.                     if(found)
  182.                     {    found->status= (*(*found->device)->gdPMap)->pixelSize == 8;
  183.                         DrawPicture(found->status?
  184.                                         YesPict:NoPict,&MessageFrame);
  185.                     }
  186.                     EndUpdate((GrafPtr)Event.message);
  187.                     ScreenAvailable=0;
  188.                     for(i=NumScreens-1;i>=0;i--)
  189.                     {    ScreenAvailable |= Screens[i].status;
  190.                     }
  191.                     break;
  192.             }
  193.         }
  194.     }    while(done==NotDone);
  195.         
  196.     switch(done)
  197.     {    case DefaultDone:
  198.             TheDisplay=0;
  199.             for(i=NumScreens-1;i>=0;i--)
  200.             {    Screens[i].status= (*(*Screens[i].device)->gdPMap)->pixelSize == 8;
  201.                 if(Screens[i].status)
  202.                 {    done=SelectDone;
  203.                     TheDisplay=Screens[i].device;
  204.                 }
  205.             }
  206.             break;
  207.         case QuitDone:
  208.             TheDisplay=0;
  209.             break;
  210.         case SelectDone:
  211.             break;
  212.     }
  213.  
  214.     CloseOptionsDialog();
  215.  
  216.     ReleaseResource(YesPict);
  217.     ReleaseResource(NoPict);
  218.  
  219.     for(i=0;i<NumScreens;i++)
  220.     {    DisposeWindow(Screens[i].window);
  221.     }
  222.  
  223.     DisposPtr(Screens);
  224.  
  225.     return    (Handle)TheDisplay;
  226. }